package com.fos.BluetoothStory.util;

import android.util.Log;

/**
 //        0000 0000  单首 00

 //        0000 0001  分首 01
 //        0000 1001  分中 09
 //        0001 0001  分结 11

 //        0000 0010  回首 02
 //        0000 1010  回中 0a
 //        0001 0010  回结 12

 */

/**
 * 从第二次命令回复的数据截取其他数据对应的命令编码 目前不考虑，从28-4F
 */
public class CommandUtil {
	public static int	startCmd	= 0x28;

	/**
	 * 两次握手命令
	 * 
	 * @param first
	 *            第一次发送命令 or 第二次
	 * @return
	 */
	public static byte[] cShakeHands(boolean first) {
		Log.i("CMD", "cShakeHands " + first);
		byte[] bytes = new byte[9];

		bytes[0] = (byte) 0x11;
		bytes[1] = (byte) 0x05;
		bytes[2] = (byte) 0x00;
		bytes[3] = first ? (byte) 0x01 : (byte) 0x02;
		bytes[4] = (byte) 0x02;
		bytes[5] = (byte) 0x55;
		bytes[6] = first ? (byte) 0x5D : (byte) 0x5E;
		bytes[7] = (byte) 0x00;
		bytes[8] = (byte) 0x12;

		return bytes;
	}


    /**
     * 构造握手命令
     *
     * @param cmdIndex
     *            对应命令编码的索引
     * @return bytes
     */
    public static byte[] cShackCommand(int cmdIndex) {
        Log.i("CMD", "cShackCommand" + cmdIndex);
        int length = 10; // 通过判断是否存在用户数据决定命令的长度
        byte[] bytes = new byte[length];

        bytes[0] = (byte) 0x11; // 包头
        bytes[1] = (byte) 0x06; // 包长度
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) (cmdIndex); // 命令编码
        bytes[4] = (byte) 0x00; // 命令信息：标识单包or分包
        bytes[5] = (byte) 0x00; // 用户数据长度
        bytes[6] = (byte) 0x00;
        bytes[7] = (byte) (bytes[1] + bytes[2] + bytes[3] + bytes[4]
                + bytes[5] + bytes[6]);
        bytes[8] = (byte) 0x00;
        bytes[length - 1] = (byte) 0x12; // 包尾

        return bytes;
    }

	public static byte[] cMakeResponse(int cmd) {
		byte[] bytes = new byte[9];

		bytes[0] = (byte) 0x11; // 包头
		bytes[1] = (byte) 0x05; // 包长度
		bytes[2] = (byte) 0x00;
		bytes[3] = (byte) cmd; // 命令编码
		bytes[4] = (byte) 0x02; // 命令信息：回复
		bytes[5] = (byte) 0x55; // 包确认标识符
		bytes[6] = (byte) 0x88;
		bytes[7] = (byte) 0x00;
		bytes[8] = (byte) 0x12; // 包尾

		return bytes;
	}

	/**
	 * 命令响应
	 */
	public static byte[] cMakeResponse(byte b) {
		byte[] bytes = new byte[9];

		bytes[0] = (byte) 0x11; // 包头
		bytes[1] = (byte) 0x05; // 包长度
		bytes[2] = (byte) 0x00;
		bytes[3] = b; // 命令编码
		bytes[4] = (byte) 0x02; // 命令信息：回复
		bytes[5] = (byte) 0x55; // 包确认标识符
		bytes[6] = (byte) (0x5c + b);
		bytes[7] = (byte) 0x00;
		bytes[8] = (byte) 0x12; // 包尾

		return bytes;
	}

	/**
	 * 构造命令,适用于单命令,单byte数据
	 * 
	 * @param index
	 *            对应命令编码的索引
	 * @param data
	 *            用户数据
	 * @return bytes
	 */
	public static byte[] cMakeCommand(int cmdIndex, byte data, boolean hasdata) {
		Log.i("CMD", "cMakeCommand cmdIndex" + cmdIndex);
		int length = hasdata ? 11 : 10; // 通过判断是否存在用户数据决定命令的长度
		byte[] bytes = new byte[length];

		bytes[0] = (byte) 0x11; // 包头
		bytes[1] = hasdata ? (byte) 0x07 : (byte) 0x06; // 包长度
		bytes[2] = (byte) 0x00;
		bytes[3] = (byte) (startCmd + cmdIndex); // 命令编码
		bytes[4] = (byte) 0x00; // 命令信息：标识单包or分包
		bytes[5] = hasdata ? (byte) 0x01 : (byte) 0x00; // 用户数据长度
		bytes[6] = (byte) 0x00;
		if (hasdata) {
			bytes[7] = data;
			bytes[8] = (byte) (bytes[1] + bytes[2] + bytes[3] + bytes[4]
					+ bytes[5] + bytes[6] + bytes[7]);
			bytes[9] = (byte) 0x00;
		} else {
			bytes[7] = (byte) (bytes[1] + bytes[2] + bytes[3] + bytes[4]
					+ bytes[5] + bytes[6]);
			bytes[8] = (byte) 0x00;
		}
		bytes[length - 1] = (byte) 0x12; // 包尾

		return bytes;
	}

	/*public static byte[] cSetEqUserDefine() {
		return cSetEQUserDefine(AppConstance.sWholeGain, AppConstance.sEQList);
	}*/

	// 总命令 11150033 000f0007 00000100 14000000 00000000 02007500 12
	// 用户数据07 00000100 14000000 00000000 0200
	/*private static byte[] cSetEQUserDefine(int wholeGain,
			ArrayList<EQBean> eQList) {
		if (eQList == null) {
			return null;
		}

		int num = 0;

		for (int i = 0; i < eQList.size(); i++) {
			if (eQList.get(i).mType != -1) {
				num++;
			}
		}

		EQBean[] eqs = new EQBean[num];

		int j = 0;
		for (int i = 0; i < eQList.size(); i++) {
			if (eQList.get(i).mType != -1) {
				eqs[j] = eQList.get(i);
				j++;
			}
		}

		byte[] eqdata = cGetEQData(wholeGain, eqs);

		// 数据长度不包括包头1 包围1 和 长度本身2
		int dataLength = eqdata.length + 6;

		// 命令总长度在数据包长度上+4
		int cmdTotalLength = dataLength + 4;

		byte[] bytes = new byte[cmdTotalLength];

		bytes[0] = 0x11; // 包头

		byte[] dataLengthBytes = intToByte2(dataLength);

		// 包长度
		bytes[1] = dataLengthBytes[0];
		bytes[2] = dataLengthBytes[1];

		bytes[3] = (byte) (startCmd + CMD.BTR_SET_EQ_USER_DEFINE); // 命令编码

		bytes[4] = 0x00; // 命令信息：标识单包or分包

		byte[] userDataLengthBytes = intToByte2(eqdata.length);
		bytes[5] = userDataLengthBytes[0]; // 用户数据长度
		bytes[6] = userDataLengthBytes[1];

		// 用户数据
		for (int i = 0; i < eqdata.length; i++) {
			bytes[7 + i] = eqdata[i];
		}

		int jiaoyan = 0;
		for (int i = 1; i < cmdTotalLength - 4; i++) {
			jiaoyan = jiaoyan + (bytes[i] & 0xFF);
		}

		byte[] jiaoyanBytes = intToByte2(jiaoyan);

		// 校验位
		bytes[cmdTotalLength - 3] = jiaoyanBytes[0];
		bytes[cmdTotalLength - 2] = jiaoyanBytes[1];

		bytes[cmdTotalLength - 1] = (byte) 0x12; // 包尾

		return bytes;
	}
	
	// 用户数据07 00000100 14000000 00000000 0200
	public static byte[] cGetEQData(int wholeGain, EQBean[] eqs) {
		int count = eqs.length;

		byte[] bytes = new byte[1 + 2 + 2 + (4 * count) + (2 * count)
				+ (2 * count) + (2 * count)];

		bytes[0] = 0x07;

		byte[] wholeGainBytes = intToByte2(wholeGain * 1024);

		bytes[1] = wholeGainBytes[0];
		bytes[2] = wholeGainBytes[1];

		byte[] countBytes = intToByte2(count);
		bytes[3] = countBytes[0];
		bytes[4] = countBytes[1];

		for (int i = 0; i < count; i++) {
			int frequency = eqs[i].mFrequency;
			byte[] frequencyBytes = intToByte4(frequency);

			bytes[i * 4 + 5] = frequencyBytes[0];
			bytes[i * 4 + 6] = frequencyBytes[1];
			bytes[i * 4 + 7] = frequencyBytes[2];
			bytes[i * 4 + 8] = frequencyBytes[3];
		}

		for (int i = 0; i < count; i++) {
			int gain = eqs[i].mGain;
			byte[] gainBytes = intToByte2(gain * 1024);

			bytes[count * 4 + 5 + i * 2] = gainBytes[0];
			bytes[count * 4 + 6 + i * 2] = gainBytes[1];
		}

		for (int i = 0; i < count; i++) {
			float qvalue = eqs[i].mQValue;
			byte[] qvalueBytes = intToByte2((int) (qvalue * 1024));

			bytes[count * 6 + 5 + i * 2] = qvalueBytes[0];
			bytes[count * 6 + 6 + i * 2] = qvalueBytes[1];
		}

		for (int i = 0; i < count; i++) {
			int type = eqs[i].mType;
			byte[] typeBytes = intToByte2(type);

			bytes[count * 8 + 5 + i * 2] = typeBytes[0];
			bytes[count * 8 + 6 + i * 2] = typeBytes[1];
		}

		return bytes;
	}*/

	/**
	 * 基于位移的int转化成byte[]
	 * 
	 * @param int number
	 * @return byte[]
	 */

	public static byte[] intToByte2(int length) {
		byte[] abyte = new byte[2];
		// "&" 与（AND），对两个整型操作数中对应位执行布尔代数，两个位都为1时输出1，否则0。
		abyte[0] = (byte) (0xff & length);
		// ">>"右移位，若为正数则高位补0，若为负数则高位补1
		abyte[1] = (byte) ((0xff00 & length) >> 8);
		return abyte;
	}

	/**
	 * 播放选定序号歌曲 命令0x38
	 * 
	 * @return
	 */
    public static byte[] cSetMusic(int data){
        int length = 12;
        byte[] bytes = new byte[length];

        bytes[0] = (byte) 0x11; // 包头
        bytes[1] = (byte) 0x08; // 包长度
        bytes[2] = (byte) 0x00;
        bytes[3] = (byte) (startCmd + CMD.BTR_SET_PLAY_MUSICID); // 命令编码
        bytes[4] = (byte) 0x00; // 命令信息：标识单包or分包
        bytes[5] = (byte) 0x02; // 用户数据长度
        bytes[6] = (byte) 0x00;

        bytes[7] = (byte) (data % 0x100); //歌曲位置
        bytes[8] = (byte) (data / 0x100);

        int tmp = (bytes[1] & 0xff) + (bytes[2] & 0xff)  + (bytes[3] & 0xff)
                + (bytes[4] & 0xff) + (bytes[5] & 0xff)  + (bytes[6] & 0xff)
                + (bytes[7] & 0xff) + (bytes[8] & 0xff);
        bytes[ 9] = (byte) (tmp % 0x100); // 校验码
        bytes[10] = (byte) (tmp / 0x100);
        bytes[11] = (byte) 0x12; // 包尾

        return bytes;
    }
    
    /**
     * 播放选定序号歌曲 命令0x38
     * 
     * @return
     */
    public static byte[] cSetMusic(int pid, int id){
    	int length = 12;
    	byte[] bytes = new byte[length];
    	
    	bytes[0] = (byte) 0x11; // 包头
    	bytes[1] = (byte) 0x08; // 包长度
    	bytes[2] = (byte) 0x00;
    	bytes[3] = (byte) (startCmd + CMD.BTR_SET_PLAY_MUSICID); // 命令编码
    	bytes[4] = (byte) 0x00; // 命令信息：标识单包or分包
    	bytes[5] = (byte) 0x02; // 用户数据长度
    	bytes[6] = (byte) 0x00;
    	
    	bytes[7] = (byte) (pid<<4); //歌曲位置
    	bytes[8] = (byte) id;
    	
    	int tmp = 0;
    	for(int i=1; i<9; i++){
    		tmp += bytes[i];
    	}
    	bytes[9] = (byte) (tmp % 0x100); // 校验码
        bytes[10] = (byte) (tmp / 0x100);
        
    	bytes[11] = (byte) 0x12; // 包尾
    	
    	return bytes;
    }

	/**
	 * 查询播放模式
	 */
	public static byte[] queryPlayMode() {
		return CommandUtil.cMakeCommand(CMD.BTR_GET_PLAY_MODE, (byte) 0x00,
				false);
	}

	/**
	 * 设置当前播放的循环模式 0x35 0x00：正常播放 0x01：单曲循环 0x02：循环播放 0x03：随机播放
	 * 
	 * @return
	 */
	public static byte[] cSetPlayLoopMode(byte b) {
		byte[] bytes = new byte[12];

		bytes[0] = (byte) 0x11; // 包头
		bytes[1] = (byte) 0x08; // 包长度
		bytes[2] = (byte) 0x00;
		bytes[3] = (byte) 0x35; // 命令编码
		bytes[4] = (byte) 0x00; // 命令信息：标识单包or分包
		bytes[5] = (byte) 0x02; // 用户数据长度
		bytes[6] = (byte) 0x00;
		bytes[7] = b; // 用户数据
		bytes[8] = (byte) 0x00;
		bytes[9] = (byte) (0x3F + b);// 校验码
		bytes[10] = (byte) 0x00;
		bytes[11] = (byte) 0x12;// 包尾

		return bytes;
	}

	/**
	 * 设置音量 0x2d 0--15 例如1108002d0001000300380012
	 * 
	 * @return
	 */
	public static byte[] cSetVolume(byte b) {
		byte[] bytes = new byte[12];

		bytes[0] = (byte) 0x11; // 包头
		bytes[1] = (byte) 0x08; // 包长度
		bytes[2] = (byte) 0x00;
		bytes[3] = (byte) (startCmd + CMD.BTR_SET_VOL); // 命令编码
		bytes[4] = (byte) 0x00; // 命令信息：标识单包or分包
		bytes[5] = (byte) 0x01; // 用户数据长度
		bytes[6] = (byte) 0x00;
		bytes[7] = b; // 用户数据
		bytes[8] = (byte) 0x00;
		int tmp = 0;
		for(int i=1; i<9; i++){
			tmp += bytes[i];
		}
		bytes[9] = (byte) tmp;// 校验码
		bytes[10] = (byte) 0x00;
		bytes[11] = (byte) 0x12;// 包尾

		return bytes;
	}

	/**
	 * 上一曲下一曲 命令0x39 0x00：上一曲 0x01：下一曲
	 * 
	 * @return
	 */
	public static byte[] cSetNext(byte b) {
		byte[] bytes = new byte[12];

		bytes[0] = (byte) 0x11; // 包头
		bytes[1] = (byte) 0x08; // 包长度
		bytes[2] = (byte) 0x00;
//		bytes[3] = (byte) 0x39; // 命令编码
		bytes[3] = (byte) (startCmd + CMD.BTR_SET_LAST_NEXT); // 命令编码
		bytes[4] = (byte) 0x00; // 命令信息：标识单包or分包
		bytes[5] = (byte) 0x02; // 用户数据长度
		bytes[6] = (byte) 0x00;
		bytes[7] = b; // 用户数据
		bytes[8] = (byte) 0x00;
//		bytes[9] = (byte) (0x43 + b);// 校验码
		int tmp = 0;
		for(int i=1; i<9; i++){
			tmp += bytes[i];
		}
		bytes[9] = (byte) tmp;// 校验码
		bytes[10] = (byte) 0x00;

		bytes[11] = (byte) 0x12;// 包尾

		return bytes;
	}

	/**
	 * @param data
	 * @return
	 */
	public static byte[] cgetListMusic(byte[] data) {
		byte[] bytes = new byte[14];

		bytes[0] = (byte) 0x11; // 包头
		bytes[1] = (byte) 0x0A; // 包长度
		bytes[2] = (byte) 0x00;
		bytes[3] = (byte) (startCmd + CMD.BTR_REQUEST_MUSIC_LIST); // 命令编码
		bytes[4] = (byte) 0x00; // 命令信息：标识单包or分包
		bytes[5] = (byte) 0x04; // 用户数据长度
		bytes[6] = (byte) 0x00;
		bytes[7] = data[0]; // 用户数据
		bytes[8] = data[1];
		bytes[9] = data[2];
		bytes[10] = data[3];
		int tmp=0;
		for(int i=1; i<11; i++){
			tmp += bytes[i];
		}
		bytes[11] = (byte) (tmp % 0x100); // 校验码
        bytes[12] = (byte) (tmp / 0x100);
//		bytes[11] = (byte) (bytes[1] + bytes[2] + bytes[3] + bytes[4] + bytes[5]
//				+ bytes[6] + bytes[7] + bytes[8] + bytes[9] + bytes[10]);// 校验码
//		bytes[12] = (byte) 0x00;
		bytes[13] = (byte) 0x12; // 包尾

		return bytes;
	}

	/**
	 * 设置当前的播放状态 命令2f 对应文档编号8
	 */
	public static byte[] cSetPlayOrPause(boolean isPause) {
		byte[] bytes = new byte[12];

		bytes[0] = (byte) 0x11; // 包头
		bytes[1] = (byte) 0x08; // 包长度
		bytes[2] = (byte) 0x00;
		bytes[3] = (byte) (startCmd + CMD.BTR_SET_PLAY_STATUS); // 命令编码
		bytes[4] = (byte) 0x00; // 命令信息：标识单包or分包
		bytes[5] = (byte) 0x02; // 用户数据长度
		bytes[6] = (byte) 0x00;

		// 用户数据
		if (isPause) {
			bytes[7] = 0x00;
		} else {

			bytes[7] = 0x01;
		}

		bytes[8] = (byte) 0x00;
		
		int tmp=0;
		for(int i=1; i<9; i++){
			tmp += bytes[i];
		}
		bytes[9] = (byte) (tmp % 0x100); // 校验码
        bytes[10] = (byte) (tmp / 0x100);
        
		bytes[11] = (byte) 0x12;// 包尾

		return bytes;
	}

	// 得到用户自定义Eq
	public static byte[] queryDefineEqModel() {
		return CommandUtil.cMakeCommand(CMD.BTR_GET_EQ_USER_DEFINE,
				(byte) 0x00, false);
	}

	// 查询播放状态
	public static byte[] queryPlayState() {
		return CommandUtil.cMakeCommand(CMD.BTR_GET_PLAY_STATUS, (byte) 0x00,
				false);
	}

	// 快进
	public static byte[] cSetPlayKuaiJinStart() {
		return cMakeCommand(CMD.BTR_SET_PLAY_BACK_FORWARD_START, (byte) 0x00,
				true);
	}

	/**
	 * 设置快进停止
	 */
	public static byte[] cSetPlayKuaiJinStop() {
		return cMakeCommand(CMD.BTR_SET_PLAY_BACK_FORWARD_STOP, (byte) 0x00,
				true);
	}

	// 快退
	public static byte[] cSetPlayKuaiTuiStart() {
		return cMakeCommand(CMD.BTR_SET_PLAY_BACK_FORWARD_START, (byte) 0x01,
				true);
	}

	/**
	 * 设置快退停止
	 */
	public static byte[] cSetPlayKuaiTuiStop() {
		return cMakeCommand(CMD.BTR_SET_PLAY_BACK_FORWARD_STOP, (byte) 0x01,
				true);
	}

	/**
	 * 设置播放模式 0x00：蓝牙工作模式 0x01：USBHost 工作模式 0x02：LINE IN 工作模式 0x03：SD 工作模式
	 * 0x04：UAC 工作模式 0x05：FM 工作模式
	 */
	public static byte[] cSetPlayMode(byte b) {
		return CommandUtil.cMakeCommand(CMD.BTR_SWITCH_MODE, b, true);
	}

	public static void setStartCMD(int parseInt) {
		startCmd = parseInt;
	}
	
	public static int getStartCmd() {
		return startCmd;
	}

	/**
	 * 设置音效 0X00：_SD_EQ_MODE_NORMAL 0x01：_SD_EQ_MODE_CLASSIC
	 * 0x02：_SD_EQ_MODE_JAZZ 0x03：_SD_EQ_MODE_POP 0x04：_SD_EQ_MODE_ROCK
	 * 0x05：_SD_EQ_MODE_EXBASS 0x06：_SD_EQ_MODE_SOFT
	 */
	public static byte[] cSetEqMode(byte data) {
		return cMakeCommand(CMD.BTR_SET_EQ_MODE, data, true);
	}

	/**
	 * 获得音效
	 */
	public static byte[] cGetEqMode() {
		return cMakeCommand(CMD.BTR_GET_EQ_MODE, (byte) 0x00, false);
	}

	// 01-18 15:29:32.318: I/OUT(16129): 11070031000100023b0012
	// 01-18 15:29:32.404: I/IN(16129): in 31,1105003102558d0012

	public static byte[] cGetVoltage() {
		return cMakeCommand(CMD.BTR_GET_VOLTAGE, (byte) 0x00, false);
	}

	public static byte[] cGetSignal() {
		return cMakeCommand(CMD.BTR_GET_BT_SIGNA, (byte) 0x00, false);
	}

	public static boolean cGetPlayPauseState(String res) {
		return res.charAt(15) == '0';
	}

	public static byte[] cgetEqUser() {
		// 110600340000003a0012
		// in 34,110500340255900012

		return cMakeCommand(CMD.BTR_GET_EQ_USER_DEFINE, (byte) 0x00, false);
	}

	/**
	 * 基于位移的int转化成byte[]
	 * 
	 * @param int number
	 * @return byte[]
	 */

	public static byte[] intToByte4(int number) {
		byte[] abyte = new byte[4];
		// "&" 与（AND），对两个整型操作数中对应位执行布尔代数，两个位都为1时输出1，否则0。
		abyte[0] = (byte) (0xff & number);
		// ">>"右移位，若为正数则高位补0，若为负数则高位补1
		abyte[1] = (byte) ((0xff00 & number) >> 8);
		abyte[2] = (byte) ((0xff0000 & number) >> 16);
		abyte[3] = (byte) ((0xff000000 & number) >> 24);
		return abyte;
	}

}
